webpack 异步加载(代码切割)的原理
webpack 一般是把所有js模块都打包到一个.js文件,然后在页面加载时请求这个文件。但是,有些js模块的功能并不需要在页面加载时生效(例如按钮点击触发的操作),因此可以把这类js模块独立导出一个.js文件(chunk)。当使用这个模块的时候,webpack 会构造 script dom 元素,由浏览器发起异步请求,去获得这个js文件(jsonp形式)。
例如:
1 | mapBtn.click(function() { |
webpack api 实现方式:
1 | mapBtn.click(function() { |
另外,ensure 会把没有使用过的 require 资源独立分成一个js文件,而对于同步的 require 会忽略:
1 | var sync = require('syncdemo.js') //下面ensure里面也用到 |
require.ensure 的参数解析(webpack 2.2)
require.ensure(dependencies: String[], callback: function(require), chunkName: String)
dependencies
依赖,回调函数被执行前需要加载完成的模块。
callback
回调函数,当所有的依赖都加载完成后,执行这个回调函数。
require对象的一个实现会作为一个参数传递给这个回调函数,因此可以进一步 require() 依赖模块。
chunkName
定义 chunk 名称, 即被打包进的.js文件名称。
多个 require.ensure 具有相同的 chunkName 参数,则这些异步请求的依赖会被打包进同一个文件束(bundle)。
一些使用情况
模块文件:
1 | // a.js |
入口文件:
1 | // entry.js |